# 导入必要的PyQt6模块  
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar  
# 导入QThread类和pyqtSignal函数，用于创建线程和定义信号  
from PyQt6.QtCore import QThread, pyqtSignal  
import time  
  
# 自定义的线程类，继承自QThread  
class WorkerThread(QThread):  
    # 定义一个名为progress_changed的信号，该信号将传递一个整数类型的参数  
    progress_changed = pyqtSignal(int)  
  
    # 重写QThread的run方法，这里是线程实际执行的地方  
    def run(self):  
        # 模拟一个计算过程，通过循环来模拟进度  
        for i in range(101):  
            # 模拟计算过程中的延时  
            time.sleep(0.1)  
            # 发射progress_changed信号，并传递当前的进度值  
            self.progress_changed.emit(i)  
  
# 主窗口类，继承自QMainWindow  
class MainWindow(QMainWindow):  
    def __init__(self):  
        super().__init__()  # 调用父类的初始化方法  
  
        self.initUI()  # 初始化用户界面  
  
    # 初始化用户界面  
    def initUI(self):  
        self.setWindowTitle('PyQt6 Multithreading Progress Bar')  # 设置窗口标题  
  
        # 创建一个进度条控件  
        self.progress_bar = QProgressBar(self)  
        self.progress_bar.setValue(0)  # 设置进度条的初始值为0  
  
        # 创建一个按钮控件  
        self.start_button = QPushButton('Start Calculation', self)  
        # 当按钮被点击时，调用start_calculation方法  
        self.start_button.clicked.connect(self.start_calculation)  
  
        # 创建一个垂直布局  
        layout = QVBoxLayout()  
        # 将进度条和按钮添加到布局中  
        layout.addWidget(self.progress_bar)  
        layout.addWidget(self.start_button)  
  
        # 创建一个中心部件，并设置其布局  
        central_widget = QWidget()  
        central_widget.setLayout(layout)  
        # 将中心部件设置为窗口的中心部件  
        self.setCentralWidget(central_widget)  
  
    # 定义一个槽函数，用于更新进度条的值  
    def update_progress_bar(self, value):  
        self.progress_bar.setValue(value)  
  
    # 启动计算任务的方法  
    def start_calculation(self):  
        # 创建一个WorkerThread的实例  
        self.thread = WorkerThread()  
        # 将WorkerThread的progress_changed信号连接到MainWindow的update_progress_bar槽函数  
        self.thread.progress_changed.connect(self.update_progress_bar)  
        # 启动线程  
        self.thread.start()  
  
# 创建QApplication的实例  
app = QApplication([])  
# 创建MainWindow的实例并显示  
ex = MainWindow()  
ex.show()  
# 进入应用程序的主事件循环  
app.exec()